###########################################
#
#  Octo-ber 2015
#
#  A casual Chip8 game jam.
#  
#  This title card draws a nearly full screen
#  64x30 animation with very low flicker
#  and acceptable framerate even at
#  7 cycles/frame by using very tight
#  unrolled loops and pre-xored data.
#
###########################################

: main
	v1 :=  1 # y offset of first stripe
	v2 := 16 # y offset of second stripe
	v3 := 15 # sprite stride

	i := frame0
	render
	
	loop
		# it would be possible to make this slightly
		# faster by inlining render, but far less
		# readable and compact for those 2 cycles per call:
		
		i := frame1
		render
		render
		render
		render
	again

# fill the screen in 8 vertical strips of 2 sprites.
# after the first, each frame is pre-xored with the
# preceding frame, avoiding the need to clear
# the screen between frames, which would add flicker:

: render
	v0 :=  0
	loop
		sprite v0 v1 15
		i  += v3
		sprite v0 v2 15
		i  += v3
		v0 += 8
		if v0 != 64 then
	again	
;

: frame0
	0xFF 0xFF 0xFF 0xFF 0xFF 0x3C 0x08 0x09 0x09 0x09 0x09 0x09 0x09 0x09 0x09 0xF8
	0xFC 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xF8 0xC0 0x00 0x00 0x00 0x00 0xF0 0xF8
	0xFE 0xFF 0xFF 0x0F 0x07 0xE7 0x26 0x24 0x24 0x24 0x24 0x24 0xE4 0x04 0x0E 0xFF
	0xFF 0xFF 0xFF 0xFC 0xE0 0x00 0x00 0x00 0x00 0x00 0x01 0x07 0x03 0x03 0x01 0x00
	0x80 0xE0 0xF0 0xFF 0x10 0x10 0xFC 0x8C 0x84 0x84 0xF4 0x1C 0x1C 0xFF 0xFE 0xF0
	0x80 0x00 0x01 0x07 0x0F 0x1F 0x7F 0xFF 0xFE 0xFC 0xF0 0xF0 0xF0 0xF8 0x78 0x78
	0x3C 0xFF 0x30 0x20 0xE6 0xE6 0xE6 0xA6 0xA6 0xE0 0xF0 0xDF 0x7F 0x40 0x40 0xF9
	0xE9 0xF9 0xC0 0xC0 0xFF 0x07 0x0F 0x0F 0xF8 0xF8 0xF8 0xF0 0xF0 0xF0 0xE1 0xE3
	0xE2 0x46 0x7E 0x42 0x42 0x7E 0x4E 0x42 0xF2 0xDF 0xFF 0x03 0x03 0x9E 0x9C 0x9E
	0x02 0x03 0xFF 0x0F 0x07 0x07 0x1F 0x1F 0x3F 0x7F 0xFF 0xFC 0xF8 0xFB 0x0E 0x04
	0x64 0x04 0x0C 0x64 0x64 0x04 0x0E 0xFB 0xC0 0xF8 0xFF 0x7F 0x3F 0x0F 0x07 0x03
	0x00 0x80 0xC0 0xE0 0xF8 0xF0 0xC0 0x80 0x00 0x00 0x00 0xFF 0x08 0x08 0xF9 0x18
	0x18 0xF9 0xF9 0x09 0x09 0xFF 0x00 0x00 0x00 0xE0 0xFC 0xFF 0xFF 0xFF 0xFF 0x7F
	0x3F 0x0F 0x00 0x00 0x00 0x00 0x00 0x01 0x0F 0xFF 0x3F 0x1F 0x9F 0x3F 0x1F 0x9F
	0x9F 0x90 0x90 0xF0 0x00 0x00 0x00 0x00 0x00 0x80 0xF0 0xFE 0xFF 0xFF 0xFF 0xFF

# the animation is actually 8 frames long,
# but it is carefully designed such that
# the xored frames have a shorter cycle.
# packing frames contiguously means we don't
# need to re-initialize i until we reach
# the last frame.

: frame1
	0x00 0x00 0x80 0xF0 0xF8 0x30 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xF0 0xF0 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x1F 0xFF 0xF8 0xC0 0x00 0x00 0x00 0x00 0x0E 0x07
	0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x0F 0xFC 0xE0 0x00 0x00 0x00 0x01 0x07 0x1E 0x38 0x02 0x03 0x81 0xC0
	0x70 0x18 0x0C 0x00 0x00 0x00 0x00 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x0E 0xF0
	0x80 0x01 0x06 0x18 0x30 0xE0 0x81 0x03 0x06 0x04 0x08 0x08 0x88 0x84 0x44 0x44
	0x20 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x80 0x00
	0x00 0x00 0x00 0x80 0x80 0x08 0x11 0x11 0xC6 0xC4 0xC4 0x88 0x88 0x88 0x91 0x10
	0x00 0x24 0x00 0x00 0x00 0x00 0x08 0x3C 0x10 0x04 0x00 0x00 0x00 0x00 0x04 0x00
	0x00 0x01 0x01 0x10 0x08 0x08 0x18 0x10 0x30 0x60 0xC0 0x83 0x06 0x04 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xC0 0x38 0x07 0x81 0x40 0x30 0x18 0x0C
	0x07 0x81 0xC0 0x60 0x07 0x0E 0x3C 0x70 0xC0 0x80 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xE0 0x7C 0x0F 0x03 0x00 0x00 0x80
	0xC0 0x70 0x80 0x00 0x00 0x00 0x00 0x01 0x0F 0x1F 0x0C 0x00 0x00 0x00 0x00 0x00
	0x00 0x0F 0x0F 0x0F 0x00 0x00 0x00 0x00 0x00 0x80 0xF0 0x7E 0x1F 0x07 0x00 0x00
: frame2
	0xE0 0xF8 0x7E 0x0F 0x00 0x00 0x00 0x00 0x00 0x00 0x80 0xF0 0xF0 0x00 0x00 0x00
	0x00 0x00 0x00 0x01 0x7F 0xFF 0xE0 0x00 0x00 0x00 0x00 0x00 0x01 0x07 0x01 0x00
	0x00 0x80 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x00 0xC0 0xC0 0x00 0x00 0x00 0x00
	0x03 0xFF 0xF0 0x00 0x00 0x00 0x01 0x07 0x1E 0x78 0xE0 0xC0 0x81 0xC0 0x60 0x30
	0x08 0x04 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x70 0x08 0x00 0x00 0x08 0xF0 0x00
	0x01 0x06 0x18 0x60 0xC1 0x03 0x06 0x0C 0x18 0x38 0x84 0x84 0x44 0x42 0x22 0x22
	0x12 0x00 0x00 0x00 0x00 0x00 0x40 0x00 0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x60 0x80 0x80 0x00 0x00 0x31 0x22 0x62 0x21 0x23 0x22 0x46 0x44 0x44 0x48 0x48
	0x10 0x10 0x00 0x00 0x00 0x00 0x04 0x00 0x20 0x28 0x01 0x00 0x00 0x01 0x09 0x00
	0x00 0x00 0x00 0x21 0x11 0x10 0x06 0x0C 0x08 0x10 0x20 0x40 0x81 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x04 0x00 0xC0 0x38 0x0E 0x83 0xC0 0x60 0x30
	0x18 0x0E 0x07 0x83 0x00 0x01 0x03 0x0F 0x3C 0x70 0xC0 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x1F 0x00 0x00 0x00 0x80 0xF0 0x3C 0x0F 0x03 0x00
	0x00 0x80 0x7C 0xF0 0xC0 0x00 0x00 0x00 0x00 0x00 0x03 0x0F 0x0F 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0xFF 0x3F 0x00 0x00 0x00 0x00 0x00 0x80 0xE0 0xF8 0x3F 0x0F
: frame3
	0x1F 0x07 0x01 0x00 0x00 0x00 0x00 0x00 0xE0 0xF0 0x70 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0xFF 0xFE 0x80 0x00 0x00 0x00 0x00 0x00 0x03 0x0F 0x7E 0xF8 0x00 0xC0
	0xE0 0x78 0x06 0x03 0x01 0x00 0x00 0x00 0xC0 0xC0 0x00 0x00 0x00 0x00 0x00 0x04
	0xFC 0x00 0x00 0x00 0x00 0x07 0x1E 0xF8 0xE0 0x80 0x00 0x00 0x70 0x38 0x18 0x0C
	0x06 0x03 0xC1 0x00 0x00 0x00 0x00 0x00 0x70 0x08 0x00 0x00 0x08 0x00 0x00 0x01
	0x0E 0x38 0xE0 0x81 0x02 0x04 0x08 0x30 0x60 0xC0 0x42 0x62 0x22 0x31 0x11 0x11
	0x89 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x80 0x00 0x00
	0x80 0x00 0x00 0x00 0x00 0x42 0x44 0x84 0x10 0x10 0x11 0x21 0x22 0x22 0x24 0x00
	0x08 0x00 0x00 0x00 0x00 0x00 0x20 0x00 0x04 0x40 0x00 0x01 0x00 0x00 0x02 0x01
	0x00 0x00 0x00 0x46 0x22 0x23 0xC1 0x83 0x07 0x0E 0x18 0x30 0x60 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x07 0x00 0x40 0x30 0x0C 0x03 0x81 0x40
	0x20 0x10 0x08 0x0C 0xC0 0x80 0x00 0x00 0x03 0x0F 0x3C 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0xE0 0x7F 0x07 0x00 0x00 0x00 0xC0 0x70 0x3C 0x0F
	0x03 0x01 0x03 0x0F 0x3F 0xF8 0xE0 0x80 0x00 0x00 0x00 0x00 0x00 0x0F 0x0F 0x00
	0x00 0x00 0x00 0x00 0x00 0xC0 0xFF 0x7F 0x03 0x00 0x00 0x00 0x00 0x00 0xC0 0xF0
: frame4
	0x00 0x00 0x00 0x00 0x00 0xC0 0xF0 0xF0 0x10 0x00 0x00 0x00 0x00 0x00 0x00 0xF0
	0xF0 0xF8 0x00 0x00 0x00 0x00 0x00 0x00 0x07 0x3F 0xFC 0xF0 0x80 0x00 0xF0 0x38
	0x1E 0x07 0x01 0x00 0x00 0x00 0xC0 0xC0 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x03 0x1F 0xF8 0xE0 0x00 0x00 0x00 0x01 0x07 0x0C 0x04 0x06 0x03
	0x81 0xE0 0x30 0x00 0x00 0x00 0x00 0x70 0x08 0x00 0x00 0x08 0x00 0x00 0x01 0x0E
	0x70 0xC0 0x01 0x06 0x0C 0x18 0x70 0xC0 0x81 0x03 0x31 0x11 0x11 0x08 0x88 0x88
	0x44 0x00 0x00 0x00 0x00 0x00 0x00 0x40 0x00 0x40 0x00 0x20 0x80 0x00 0x00 0x80
	0x10 0x00 0x00 0x00 0x00 0x84 0x88 0x08 0x08 0x08 0x08 0x10 0x11 0x11 0x02 0x24
	0x24 0x08 0x00 0x00 0x00 0x00 0x10 0x00 0x08 0x10 0x00 0x00 0x01 0x00 0x00 0x00
	0x01 0x00 0x00 0x88 0xC4 0xC4 0x20 0x60 0xC0 0x81 0x07 0x0C 0x18 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x38 0x07 0x80 0x40 0x30 0x0C 0x06 0x83
	0xC0 0x60 0x30 0x10 0x38 0x70 0xC0 0x80 0x00 0x00 0x03 0x00 0x00 0x00 0x00 0x00
	0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 0xF8 0x1F 0x03 0x00 0x00 0x80 0xC0 0x70
	0x3C 0x0E 0x00 0x00 0x00 0x07 0x1F 0x7E 0xF0 0x00 0x00 0x00 0x00 0x00 0x00 0x0F
	0x0F 0x00 0x00 0x00 0x00 0x00 0x00 0x80 0xFC 0x7F 0x0F 0x01 0x00 0x00 0x00 0x00
